////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////@

// Το παρόν περιέχει γενικές δομές και μεθόδους που αφορούν τόσο στον server
// όσο και στους clients, αλλά είναι εξειδικευμένες στoν «Πρεφαδόρο». Όλα τα
// σχετικά εντάσσονται στο singleton "Prefadoros".

Prefadoros = {
	// Η property "thesiMax" δείχνει τον μέγιστο αριθμό θέσης στο τραπέζι.
	// Μπορεί να φαίνεται υπερβολικό, αλλά βολεύει σε αλλαγή παιχνιδιού.

	thesiMax: 3,

	// Χρησιμοποιούμε το associative array "thesiValid" για να διατρέχουμε
	// τις θέσεις του τραπεζιού (η σειρά δεν είναι εγγυημένη από τη γλώσσα).

	thesiValid: {},

	// Η μέθοδος "isThesi" δέχεται ένα όρισμα και ελέγχει αν το όρισμα αυτό
	// είναι δεκτό ως θέση τραπεζιού.

	isThesi: function(thesi) {
		return Prefadoros.thesiValid[thesi];
	},

	// Η μέθοδος "oxiThesi" δέχεται ένα όρισμα και ελέγχει αν το όρισμα αυτό
	// δεν είναι δεκτό ως θέση τραπεζιού.

	oxiThesi: function(thesi) {
		return !Prefadoros.isThesi(thesi);
	},

	fetchThesi: function(thesi) {
		if (Prefadoros.isThesi(thesi)) return Prefadoros.thesiValid[thesi];
		globals.fatal('Prefadoros.fetchThesi: ' + thesi + ': απαράδεκτη θέση');
	},
};

// Έχουν καθοριστεί οι πίνακες αντιστοίχισης ονομασίας διαφόρων χαρακτηριστικών
// σε οικονομικότερες ονομασίες. Με βάση αυτούς τους πίνακες θα δημιουργήσω τώρα
// τους αντίστροφους πίνακες.

(function() {
	var i;
	for (i = 1; i <= Prefadoros.thesiMax; i++) Prefadoros.thesiValid[i] = i;
})();

// Η μέθοδος "epomenosPektis" εφαρμόζεται πάνω στη θέση κάποιου παίκτη και
// επιστρέφει την επόμενη θέση.

Number.prototype.epomenosPektis = function() {
	var thesi;

	if (!Prefadoros.thesiValid.hasOwnProperty(this))
	globals.fatal('epomenosPektis: ' + this + ': ακαθόριστη θέση παίκτη');

	thesi = this.valueOf() + 1;
	if (thesi > Prefadoros.thesiMax) thesi = 1;
	return thesi;
}

// Η μέθοδος "isDexia" εφαρμόζεται πάνω στη θέση κάποιου παίκτη και επιστρέφει
// true αν η θέση αυτή βρίσκεται δεξιά από τη θέση που περνάμε ως παράμετρο.

Number.prototype.isDexia = function(thesi) {
	return thesi.epomenosPektis() == this;
}

// Η μέθοδος "isAristera" εφαρμόζεται πάνω στη θέση κάποιου παίκτη και επιστρέφει
// true αν η θέση αυτή βρίσκεται αριστερά από τη θέση που περνάμε ως παράμετρο.

Number.prototype.isAristera = function(thesi) {
	return this.epomenosPektis() == thesi;
}

String.prototype.epomenoXroma = function() {
	switch (this.valueOf()) {
	case 'S': return 'C';
	case 'C': return 'D';
	case 'D': return 'H';
	case 'H': return 'N';
	}

	globals.fatal('epomenoXroma: ' + this + ': ακαθόριστο επόμενο χρώμα');
}
